//9.接口 接口用于描述对象的形状（确定对象的属性结构）
//接口 就是用来约束定义对象 或  类 class
//定义接口 用interface
interface Man{
    //username是必填属性
    username:string,
    // age? 可选属性
    age?:number,
    //只读属性
    readonly gender:number,
    isMarry:any, //任意类型
    //定义接口的方法
    run:(speed:number,unit:string)=>string;
    sing:(misicname:string)=>string,
    //特殊写法 任意属性  比较少用. 可以在对象里面添加任意属性
    [key:string]:any
}
let tom:Man={
    username:"Tom",
    gender:0,//只读属性 ，定义的时候给一个初始值
    isMarry:undefined,
    run(speed:number,unit:string):string{
        return ""
    },
    sing(musicname){
        return musicname;
    },
    money:"一个亿",
    typing:()=>{}
    // typing(){}
}
// tom.gender=1;//只读属性不能被赋值
let re:string=tom.run(1,'米/s');
// 9.1 接口和数组结合。。。。。。。。。。。。。。。。。。。。。
interface User{
    name:string,//必填属性
    age:number, //必写属性
    gender?:number//可选属性
}
let users:User[]=[{name:'老王',age:18},{name:"王鸿",age:19}];
    // users.push({
    //     id:1,name:"Paul",age:20 //错误 因为User没有id属性
    // })
    users.push({name:"Paul",age:20,gender:1});//正确
// 数组泛型
let members:Array<User>=[];
    members.push({name:"Jerry",age:5})
// 定义一个数组接口类型
interface UserImp{
    [index:number]:User
}
let vips:UserImp=[
   {name:"谢老板",age:20},
// {name:"佳仪",age:18,gender:1,hair:"长头发"} //错误的 User没有Hair属性
]
//9.2接口继承。。。。。。。。。。。。。。。。。。。。。。。
interface Machine{
    price:number;
}
interface Computer extends Machine{
    keybord:string
}
//接口继承的属性
let lenovo:Computer={
    keybord:"机械键盘",
    price:99.99
}
//接口可以继承多个
interface Pad{
    size:string
}
interface Ipad extends Pad,Machine{//继承多个接口
    logo:string
}
let ipad2021:Ipad={
    size:"10.2寸",
    logo:"Apple",
    price:1000
}
//接口一般用来规范 对象结构.